package com.pai4j.message.core.template;

import java.util.Map;

/**
 * 模板引擎接口
 * 用于支持多种模板引擎（FreeMarker、Velocity等）
 * 
 * 实现此接口可扩展新的模板引擎
 *
 * @author PAI4J Team
 * @date 2025-11-01
 */
public interface TemplateEngine {

    /**
     * 获取模板引擎名称
     * 
     * @return 引擎名称（如：freemarker、velocity、simple等）
     */
    String getName();

    /**
     * 渲染模板
     * 
     * @param template 模板内容或模板ID
     * @param context 模板上下文变量
     * @return 渲染结果
     */
    String render(String template, Map<String, Object> context);

    /**
     * 渲染模板（使用变量数组）
     * 
     * @param template 模板内容
     * @param varNames 变量名数组
     * @param varValues 变量值数组
     * @return 渲染结果
     */
    default String render(String template, String[] varNames, Object[] varValues) {
        if (varNames == null || varValues == null || varNames.length != varValues.length) {
            return template;
        }

        Map<String, Object> context = new java.util.HashMap<>();
        for (int i = 0; i < varNames.length; i++) {
            context.put(varNames[i], varValues[i]);
        }
        return render(template, context);
    }

    /**
     * 判断是否支持指定的模板类型
     * 
     * @param templateType 模板类型
     * @return 是否支持
     */
    default boolean supports(String templateType) {
        return getName().equalsIgnoreCase(templateType);
    }

    /**
     * 获取模板引擎的优先级
     * 数字越小优先级越高
     * 
     * @return 优先级（默认100）
     */
    default int getPriority() {
        return 100;
    }

    /**
     * 判断模板引擎是否可用
     * 
     * @return 是否可用
     */
    default boolean isAvailable() {
        return true;
    }

    /**
     * 验证模板语法
     * 
     * @param template 模板内容
     * @return 是否有效
     */
    default boolean validateTemplate(String template) {
        try {
            render(template, java.util.Collections.emptyMap());
            return true;
        } catch (Exception e) {
            return false;
        }
    }

    /**
     * 获取模板引擎描述信息
     * 
     * @return 描述信息
     */
    default String getDescription() {
        return String.format("TemplateEngine[name=%s, priority=%d]", getName(), getPriority());
    }
}

